/*校验条件
    外国人证件类型校验
    1.客户姓名长度应在4个字符以上
    2.录入的歪果仁永久居留证 中文名字不允许有空格
    3.英文名字不能在开头和结尾有空格
    4.证件号码长度等于15位 
    5证件止期大于当前日期
*/
    export function autoCheckFiled(AppntName,IDType,IDNo,IsLongFlag,IDValiDate,PolApplyDate){
        /*参数AppntName 客户姓名   
        // IDType 证件类型 
        // IDNo 证件号码 
        // IsLongFlag 是否长期标志 
        // IDValiDate 证件止期  
        PolApplyDate 保单申请日期*/
        if(IDType=="5") {
            if(AppntName.replace(/[^\x00-\xff]/g, "**").length<4){//客户姓名的长度应大于4个字符
                alert("录入‘外国人永久居留身份证’长度应在4个字符以上!");
                return false;
            }       
            if(/[\u4E00-\u9FA5]/g.test(AppntName) && AppntName.indexOf(" ")>=0){//输入的是汉字不允许有空格
                alert("录入‘外国人永久居留身份证’中文名字不允许有空格!");
                return false;
            }
            if(/.*[A-Za-z]+.*$/.test(AppntName)&&(AppntName.substring(0,1).indexOf(" ")>=0||AppntName.substring(AppntName.length-1,AppntName.length).indexOf(" ")>=0)) { 
                alert("英文名字不能在开头和结尾有空格！"); //英文名字不能在开头和结尾有空格
                return false;  
            }      
            if(IDNo.length!=15){//证件号码的长度是否等于15位
                alert("证件号码长度的等于15!");
                return false;
            }
            if(IsLongFlag==false && PolApplyDate>IDValiDate){//保单申请日期大于当前日期的校验
                alert("证件止期需大于当前日期");
                return false;
            }
        }
        return true;
    }
    // 判断年份是否为闰年
    function LeapYear(yyyy){
        //判断闰年的条件
        if (yyyy % 400 == 0 || (yyyy % 4 == 0 && yyyy % 100 != 0))
        {
            //若为闰年返回true
            return true;
        }
        else
        {
            //不是闰年则返回false
            return false;
        }
    }
    //户口本校验
    // 户口本是18位数，前17位中不能有除数字以外其他字符 
    // *4，6，9，11月份的日期不能超过30天
    export function checkResidenIDNo(idCard)
    {
        var SystemDate=new Date(); //获取当前时间
        var year=SystemDate.getFullYear(); //获取当前年
        var month=SystemDate.getMonth()+1; //获取当前月
        var day=SystemDate.getDate(); //获取当前日
        var yyyy; //年
        var mm; //月
        var dd; //日
        var birthday; //生日
        var sex; //性别
        var id=idCard; //传进来的参数
        var id_length=id.length;  //转换长度
        
        for(var i =0 ;i<id_length-1;i++){
            if(isNaN(idCard.charAt(i)))//  判断每个值是否为数字  如果有其他字符  就提示用户 前17位数字中不能有字符
            {
                alert("户口本号是18位时，前17位中不能有字符！");
                return false;
            }
        }
        if(isNaN(idCard.charAt(17))&& idCard.charAt(17) !="X" && idCard.charAt(17) !="x" ){
            alert("户口本校验错误，请认真检查！");
            return false;
        }
        if (idCard.indexOf("X") > 0 && idCard.indexOf("X")!=17 || idCard.indexOf("x")>0 && idCard.indexOf("x")!=17){
            alert("户口本中\"X\"输入位置不正确！");
            return false;
        }
        yyyy=id.substring(6,10);//年：截取身份证的7-10位 
        if (yyyy>year || yyyy<1900){
            alert("户口本号年度非法！");
            return false;
        }
        mm=id.substring(10,12);//月份：截取身份证的10-12位
        if (mm>12 || mm<=0){
            alert("户口本号月份非法！");
            return false;
        }
        if(yyyy==year&&mm>month){
            alert("户口本号月份非法！");
            return false;
        }
        dd=id.substring(12,14);
        if (dd>31 || dd<=0)//判断日期大于31号 小于0天 就是非法户口本号
        {
            alert("户口本号日期非法！");
            return false;
        }
    
        if((mm==4||mm==6||mm==9||mm==11)&&(dd>30))	//4,6,9,11月份日期不能超过30
        {
            alert("户口本号日期非法！");
            return false;
        }
        //判断2月份
        if(mm==2)
        {
            if(LeapYear(yyyy))
            {
                if(dd>29)//2月份的天数如果大于29天 就是非法户口本号
                {
                    alert("户口本号日期非法！");
                    return false;
                }
            }
            else
            {
                if(dd>28)
                {
                    alert("户口本号日期非法！");
                    return false;
                }
            }
        }
        if(yyyy==year&&mm==month&&dd>day)
        {
            alert("户口本号日期非法！");
            return false;
        }
        if (id.charAt(17)=="x" || id.charAt(17)=="X")
        {
            if ("x"!=GetVerifyBit(id) && "X"!=GetVerifyBit(id))//户口本前17位中如果有字母X的校验
            {
                alert("户口本校验错误，请认真检查！");
                return false;
            }
        }
        else
        {
            if (id.charAt(17)!=GetVerifyBit(id))
            {
                alert("户口本校验错误，请认真检查！");
                return false;
            }
        }
        return true;
    }
    //根据身份证号取得性别 update 2004-12-09 wzw
    /*身份证的倒数第二位如果是奇数的话就是男  偶数就是女*/
    export function getSexByIDNo(iIdNo)
    {
        var tSex=""; //区分男女
        var strReturn=""; //存储提示
        
    //	if((iIdNo.length!=15) &&(iIdNo.length!=18))
        if(iIdNo.length!=18) //modify by leifan 2014-9-19
        {
            strReturn = "输入的身份证号位数错误";
            return strReturn;
        }
        var tmpInt=0;
        // 判断长度是否正确
        if(iIdNo.length==15)
        {
            tmpInt = parseInt(iIdNo.substring(14));
        }
        if(iIdNo.length==18)
        {
            tmpInt = parseInt(iIdNo.substring(16,17));
        }
        // 判断性别
        tmpInt = tmpInt % 2;
        if(tmpInt==0)
        {
            tSex="1";
        }
        else
        {
            tSex="0";
        }
        return tSex;
    }
    /**
     * 以年龄和性别校验身份证号的函数
     * 参数，输入的证件号码，出生日期，性别
     * 返回  布尔值
     */
    function chkIdNo(iIdNo, iBirthday ,iSex)
    {
        var tmpStr="";
        var idDate="";
        var tmpInt=0;
        var strReturn = "";
        iIdNo = trim(iIdNo);
        iBirthday = trim(iBirthday);
        iSex = trim(iSex);
    //	if((iIdNo.length!=15) &&(iIdNo.length!=18))
        if(iIdNo.length!=18) //modify by leifan 2014-9-19
        {
            strReturn = "输入的身份证号位数错误";
            return strReturn;
        }
        if(!(isDate(iBirthday)))
        {
            strReturn = "输入的日期格式错误";
            return strReturn;
        }
        //转换日期格式到yy－mm－dd，by Minim
        var arrDate = iBirthday.split("-");
        if(arrDate[1].length == 1) arrDate[1] = "0" + arrDate[1];
        if(arrDate[2].length == 1) arrDate[2] = "0" + arrDate[2];
        iBirthday = arrDate[0] + "-" + arrDate[1] + "-" + arrDate[2];
        if(iSex!="0" && iSex!="1")
        {
            strReturn = "输入的性别不明确";
            return strReturn;
        }
        //先判断长度 在判断输入的性别与身份证号的信息是否一致
        if(iIdNo.length==15)
        {
            tmpStr=iIdNo.substring(6,12);
            tmpStr= "19" + tmpStr;
            tmpStr= tmpStr.substring(0,4) + "-" + tmpStr.substring(4,6) + "-" + tmpStr.substring(6)
            if(iBirthday == tmpStr)
            {
                if(iSex=="0")
                {
                    tmpInt = parseInt(iIdNo.substring(14));
                    tmpInt = tmpInt % 2
                    if(tmpInt==0)
                    {
                        strReturn = "输入的性别与身份证号的信息不一致";
                        return strReturn;
                    }
                }
                else
                {
                    tmpInt = parseInt(iIdNo.substring(14));
                    tmpInt = tmpInt % 2
                    if(tmpInt!=0)
                    {
                        strReturn = "输入的性别与身份证号的信息不一致";
                        return strReturn;
                    }
                }
            }
            else
            {
                strReturn = "输入的生日与身份证号的信息不一致";
                return strReturn;
            }
            return strReturn;
        }
        //先判断长度 在判断性别与身份证号的信息是否一致
        if(iIdNo.length==18)
        {
            tmpStr=iIdNo.substring(6,14);
            tmpStr= tmpStr.substring(0,4) + "-" + tmpStr.substring(4,6) + "-" + tmpStr.substring(6)
            if(iBirthday == tmpStr)
            {
                if(iSex=="0")
                {
                    tmpInt = parseInt(iIdNo.substring(16,17));//判断倒数第二位  如果是奇数就是男 偶数就是女  
                    tmpInt = tmpInt % 2
                    if(tmpInt==0)
                    {
                        strReturn = "输入的性别与身份证号的信息不一致";
                        return strReturn;
                    }
                }
                else
                {
                    tmpInt = parseInt(iIdNo.substring(16,17));
                    tmpInt = tmpInt % 2
                    if(tmpInt!=0)
                    {
                        strReturn = "输入的性别与身份证号的信息不一致";
                        return strReturn;
                    }
                }
            }
            else
            {
                strReturn = "输入的生日与身份证号的信息不一致";
                return strReturn;
            }
            return strReturn;
        }
    }
    /**
     * 通过身份证号的得到出生日期函数
     * 参数，输入的证件号码
     * 返回  出生日期
     */
    // 截取身份证号的 7-14位
    export function getBirthdatByIdNo(iIdNo)
    {
        var tmpStr="";
        var idDate="";
        var tmpInt=0;
        var strReturn = "";
        // iIdNo = trim(iIdNo);
    	if((iIdNo.length!=15) &&(iIdNo.length!=18))
        //  if(iIdNo.length!=18) //modify by leifan 2014-9-19
        {
            strReturn = "输入的身份证号位数错误";
            return strReturn;
        }
        if(iIdNo.length==15)
        {
            tmpStr=iIdNo.substring(6,12);
            tmpStr= "19" + tmpStr;
            tmpStr= tmpStr.substring(0,4) + "-" + tmpStr.substring(4,6) + "-" + tmpStr.substring(6)
            return tmpStr;
        }
        else
        {
            tmpStr=iIdNo.substring(6,14);
            tmpStr= tmpStr.substring(0,4) + "-" + tmpStr.substring(4,6) + "-" + tmpStr.substring(6)
            return tmpStr;
        }
    }
     /**
     * 计算身份证校验码
     * 兰军 2005-7-2 17:06
     * 原理:
     * ∑(a[i]*W[i]) mod 11 ( i = 2, 3, ..., 18 )(1)
     * "*" 表示乘号
     * i--------表示身份证号码每一位的序号，从右至左，最左侧为18，最右侧为1。
     * a[i]-----表示身份证号码第 i 位上的号码
     * W[i]-----表示第 i 位上的权值 W[i] = 2^(i-1) mod 11
     * 计算公式 (1) 令结果为 R
     * 根据下表找出 R 对应的校验码即为要求身份证号码的校验码C。
     * R 0 1 2 3 4 5 6 7 8 9 10
     * C 1 0 X 9 8 7 6 5 4 3 2
     * X 就是 10，罗马数字中的 10 就是 X
     * 15位转18位中,计算校验位即最后一位
     */
    export function GetVerifyBit(id)
    {
        var result;
        var nNum=eval(id.charAt(0)*7+id.charAt(1)*9+id.charAt(2)*10+id.charAt(3)*5+id.charAt(4)*8+id.charAt(5)*4+id.charAt(6)*2+id.charAt(7)*1+id.charAt(8)*6+id.charAt(9)*3+id.charAt(10)*7+id.charAt(11)*9+id.charAt(12)*10+id.charAt(13)*5+id.charAt(14)*8+id.charAt(15)*4+id.charAt(16)*2);
        nNum=nNum%11;
        switch (nNum)
        {
            case 0 :
                result="1";
                break;
            case 1 :
                result="0";
                break;
            case 2 :
                result="X";
                break;
            case 3 :
                result="9";
                break;
            case 4 :
                result="8";
                break;
            case 5 :
                result="7";
                break;
            case 6 :
                result="6";
                break;
            case 7 :
                result="5";
                break;
            case 8 :
                result="4";
                break;
            case 9 :
                result="3";
                break;
            case 10 :
                result="2";
                break;
        }
        return result;
    }
    /**
     * 严格校验身份证号码
     * 公民身份号码是特征组合码，
     * 由十七位数字本体码和一位数字校验码组成。
     * 排列顺序从左至右依次为：六位数字地址码，八位数字出生日期码，
     * 三位数字顺序码和一位数字校验码。顺序码的奇数分给男性，偶数分给女性。
     * 校验码是根据前面十七位数字码，按照ISO7064:1983.MOD11-2校验码计算出来的检验码。
     
     * 大陆港澳台地区证件类型分析：
     * 地区代码6位（第1-6位）：其中台湾710000；香港810000；澳门910000；
     * 出生年份4位（第7-10位）
     * 出生月份2位（第11-12位）
     * 出生日期2位（第13-14位）
     * 管辖区2位（第15-16位）
     * 性别代码1位（第17位），奇数代表男，从1开始；偶数代表女，从0开始
     * 校验码1位（第18位）从0，1，2，3，4，5，6，7，8，9，X十一位数字中，任意选
     */
    /*
    校验1、身份证号为空的时候 提示框
        2.身份证号长度不等于18位数 提示用户 身份证的长度应在18位
        3.长度为15位数 循环这些数 判断其中的数值是否有其他字符 
    */ 
    export function checkIdCard(idCard)
    {
        var SystemDate=new Date();
        var year=SystemDate.getFullYear();
        var month=SystemDate.getMonth()+1;
        var day=SystemDate.getDate();
        var yyyy; //年
        var mm; //月
        var dd; //日
        var birthday; //生日
        var sex; //性别
        var id=idCard;//身份证号码
        var id_length=id.length;//身份证号的长度
        if (id_length==0)
        {
            // alert("请输入身份证号码!");
            return false;
        }
        if (id_length!=18)    
        {
            // alert("身份证号长度应为18位！");
            return false;
        }
        if (id_length==15)
        {
            for(var i =0 ;i<id_length;i++)
            {
                if(isNaN(idCard.charAt(i)))
                {
                    // alert("15位身份证号中不能有字符！");
                    return false;
                }
            }
            yyyy="19"+id.substring(6,8);
            mm=id.substring(8,10);
            dd=id.substring(10,12);
            if (mm>12 || mm<=0)
            {
                // alert("身份证号月份非法！");
                return false;
            }
            if (dd>31 || dd<=0)
            {
                // alert("身份证号日期非法！");
                return false;
            }
            //4,6,9,11月份日期不能超过30
            if((mm==4||mm==6||mm==9||mm==11)&&(dd>30))
            {
                // alert("身份证号日期非法！");
                return false;
            }
            //判断2月份
            if(mm==2)
            {
                if(LeapYear(yyyy))
                {
                    if(dd>29)
                    {
                        // alert("身份证号日期非法！");
                        return false;
                    }
                }
                else
                {
                    if(dd>28)
                    {
                        // alert("身份证号日期非法！");
                        return false;
                    }
                }
            }
        }
        else
        {
            for(var i =0 ;i<id_length-1;i++)
            {
                if(isNaN(idCard.charAt(i)))
                {
                    // alert("身份证号中前17位中不能有字符！");
                    return false;
                }
            }
            if(isNaN(idCard.charAt(17))&& idCard.charAt(17) !="X" && idCard.charAt(17) !="x" )
            {
                // alert("身份证校验错误，请认真检查！");
                return false;
            }
            if (idCard.indexOf("X") > 0 && idCard.indexOf("X")!=17 || idCard.indexOf("x")>0 && idCard.indexOf("x")!=17)
            {
                // alert("身份证中\"X\"输入位置不正确！");
                return false;
            }
            yyyy=id.substring(6,10);
            if (yyyy>year || yyyy<1900)
            {
                // alert("身份证号年度非法！");
                return false;
            }
            mm=id.substring(10,12);
            if (mm>12 || mm<=0)
            {
                // alert("身份证号月份非法！");
                return false;
            }
            if(yyyy==year&&mm>month)
            {
                // alert("身份证号月份非法！");
                return false;
            }
            dd=id.substring(12,14);
            if (dd>31 || dd<=0)
            {
                // alert("身份证号日期非法！");
                return false;
            }
            //4,6,9,11月份日期不能超过30
            if((mm==4||mm==6||mm==9||mm==11)&&(dd>30))
            {
                // alert("身份证号日期非法！");
                return false;
            }
            //判断2月份
            if(mm==2)
            {
                if(LeapYear(yyyy))
                {
                    if(dd>29)
                    {
                        // alert("身份证号日期非法！");
                        return false;
                    }
                }
                else
                {
                    if(dd>28)
                    {
                        // alert("身份证号日期非法！");
                        return false;
                    }
                }
            }
            if(yyyy==year&&mm==month&&dd>day)
            {
                // alert("身份证号日期非法！");
                return false;
            }
            if (id.charAt(17)=="x" || id.charAt(17)=="X")
            {
                if ("x"!=GetVerifyBit(id) && "X"!=GetVerifyBit(id))
                {
                    // alert("身份证校验错误，请认真检查！");
                    return false;
                }
            }
            else
            {
                if (id.charAt(17)!=GetVerifyBit(id))
                {
                    // alert("身份证校验错误，请认真检查！");
                    return false;
                }
            }
        }
        return true;
    }
    //所有证件号位数格式的校验
    export function chkIDtype(IDType,IDNo) //参数：证件类型  证件号码
    {
        var IdNo = trim(IDNo);
        var idnoLength = getBytes(IdNo);
        if(IDType=='1'&&idnoLength<3){
            alert('护照号码应不少于3个字符!');
            return false;
        }else if(IDType=='2'&&idnoLength<10){
            //20141008 lis-28634 调整为10位
            alert('军人证号码应不少于10个字符!');
            return false;
        }else if(IDType=='2'&&idnoLength>18){
            //20141008 lis-28634 新增18位
            alert('军人证号码应不多于18个字符!');
            return false;
        }else if(IDType=='4'&&idnoLength<3){
            alert('户口本号码应不少于3个字符!');
            return false;
        }else if(IDType=='6'&&idnoLength<6){
            alert('警官证号码应不少于6个字符!');
            return false;
        }else if(IDType=='7'&&idnoLength<3){
            alert('出生证号码应不少于3个字符!');
            return false;
        }else if(IDType=='9'&&idnoLength<8){
            alert('港澳台回乡证号码应不少于8个字符!');
            return false; 
        }
        //hzq  2014-12-18
    //	else if(IDType=='0'&&idnoLength==18&&IdNo.substr(17,18)=='X'){
    //		alert('18位身份证最后一位若为X，须为半角小写x！');
    //		return false;
    //	}else if(IDType=='4'&&idnoLength==18&&IdNo.substr(17,18)=='X'){
    //		alert('18位户口本最后一位若为X，须为半角小写x！');
    //		return false;
    //	}
        return true;
    }

    /**
    * 通过出生日期获取当前年龄
    * @param strBirthday：指的是出生日期，格式为"1990-01-01",字符串类型
    */
    export function getCurrentAgeByBirthDate(strBirthday,newDate){
        // 将出生日期的字符串通过"-"分割成数组
        const strBirthdayArr = strBirthday.split("-")
        // 拿到出生日期的年
        const birthYear = strBirthdayArr[0]
        // 拿到出生日期的月
        const birthMonth = strBirthdayArr[1]
        // 拿到出生日期的日
        const birthDay = strBirthdayArr[2]
        // 创建一个时间对象
        const d = new Date(newDate)
        // 拿到当前时间的年
        const nowYear = d.getFullYear()
        // 拿到当前时间的月
        const nowMonth = d.getMonth() + 1
        // 拿到当前时间的日
        const nowDay = d.getDate()
        // 如果出生日期的年等于当前时间的年
        if(nowYear === birthYear) return 0 // 返回周岁年龄 0,并终止函数执行
        // 如果如果出生日期的年不等于于当前时间的年,则拿到年之差
        const ageDiff = nowYear - birthYear ; // 年之差
        // 如果年之差是个负数,则表示用户输入的出生日期错误,晚于今天,返回 -1,并终止函数执行
        if(ageDiff < 0) return -1 // 返回错误 -1,并终止函数执行
        // 如果年之差是个正整数,但出生日期的月与当前时间的月不相等
        if(nowMonth !== birthMonth){
            // 拿到出生日期的日与当前时间的月之差
            const monthDiff = nowMonth - birthMonth; // 月之差
            // 如果月之差是个负数,则年之差 - 1后得到周岁年龄,否则直接得到周岁年龄
            return monthDiff < 0 ? ageDiff - 1 : ageDiff  // 返回周岁年龄,并终止函数执行
        }
        // 如果出生日期的月与当前时间的月相等,则拿到出生日期的日与当前时间的日之差
        const dayDiff = nowDay - birthDay;
        // 如果日之差是个负数,则年之差 - 1得到周岁年龄,否则直接得到周岁年龄
        return dayDiff < 0 ? ageDiff - 1 : ageDiff // 返回周岁年龄,并终止函数执行
    }

